package com.browsesoft.htmlcomponent;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.browsesoft.ExtendElement;
import com.browsesoft.dbtools.DBTools;
import com.browsesoft.workflow.support.sortInterface;

public class HTMLStatisticModel implements HTMLTableModel, sortInterface {
	/**
	 * Model所对应的component
	 */
	protected HTMLBasicComponent component = null;

	/**
	 * 从表中取得的所有数据
	 */
	protected String datas[][] = null;

	/**
	 * 取数据时的sql语句
	 */
	protected String sql = null;

	/**
	 * 要显示的所有字段中文名
	 */
	protected LinkedList cnames = new LinkedList();

	protected String sortname = "";

	/**
	 * 父节点号
	 */
	protected String parentID = null;

	protected boolean orderby = false;

	private boolean issort = false;

	/**
	 * 初始化model
	 */
	public void init(HttpServletRequest request) throws Exception {
		// 接收sql
		sql = request.getParameter("sql");
		// 接收占位符字符串，是一个以逗号分隔的集合
		String placeholders = request.getParameter("placeholders");
		// 用实际的值替换掉sql中的占位符，构造完整的sql
		if (sql != null && placeholders != null) {
			StringTokenizer st = new StringTokenizer(placeholders, ",");
			while (st.hasMoreTokens()) {
				String placeholder = st.nextToken();
				// 获得用户填写的占位符所对应的值
				String value = request.getParameter(placeholder);
				if (value != null) {
					// 用实际的值替换sql中的占位符
					sql = sql.replaceAll(placeholder, value);
				}
			}
		}
		// 获取中文名字列表
		String cnameStr = request.getParameter("cnameStr");
		if (cnames != null) {
			StringTokenizer st = new StringTokenizer(cnameStr, ",");
			while (st.hasMoreTokens()) {
				// 获得中文名字表
				String s = st.nextToken();
				this.cnames.add(s);
			}
		}
	}

	/**
	 * 设置查询条件
	 */
	public void setCondition(String condition) {
	}

	/**
	 * 得到列数
	 * 
	 * @return 列数
	 */
	public int getColumnCount() {
		return cnames.size();
	}

	/**
	 * 得到列的名称
	 * 
	 * @param index
	 *            列号
	 * @return 列的名称
	 */
	public String getColumnName(int index) {
		if (index < cnames.size()) {
			return (String) cnames.get(index);
		} else {
			return "";
		}
	}

	/**
	 * 得到列的英文名
	 * 
	 * @param index
	 *            列号
	 * @return 列的英文名
	 */
	public String getColumnEname(int index) {
		return "";
	}

	public Object getDatas() {
		return null;
	}

	/**
	 * 得到行数
	 * 
	 * @return 行数
	 */
	public int getRowCount() {
		if (datas == null) {
			return 0;
		}
		return datas.length - 1;
	}

	/**
	 * 设置传递的参数
	 * 
	 * @param request
	 */
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// 得到条件
		String condition = request.getParameter("condition");
		if (parentID == null) {
			parentID = request.getParameter("point");
		}
		// 保持原有SQL非条件部分不动
		String executeSQL = new String(sql);
		// 有必备条件
		if (parentID != null) {
			// 添加必备条件
			executeSQL = "select * from (" + sql + ") where processid="
					+ parentID;
			// 补上用户输入的条件
			if (condition != null && !condition.equals("")) {
				executeSQL += " and " + condition;
			}
		}
		// 没有必备条件
		else {
			// 添加用户输入的条件
			if (condition != null && !condition.equals("")) {
				executeSQL += "select * from (" + sql + ")  where " + condition;
			}
		}
		// 如果扔出sql异常，证明没有表，将datas赋值为null
		try {
			// 得到结果
			datas = DBTools.executeQueryWithTableHead(executeSQL);
		} catch (SQLException s) {
			datas = null;
		}
	}

	/**
	 * 得到某列的操作类型
	 * 
	 * @return 类型
	 */
	public String getType(int col) {
		if (col < cnames.size()) {
			return "td";
		}
		return null;
	}

	/**
	 * 修改模板单元格的内容
	 * 
	 * @param td
	 *            模板单元格
	 * @param doc
	 *            模板所对应文档
	 * @param row
	 *            行
	 * @param col
	 *            列
	 */
	public void modifyCellValue(Element td, Document doc, int row, int col) {
		try {
			// 显示内容
			if (col < cnames.size()) {
				ExtendElement.replaceElementContext(td, doc
						.createTextNode(datas[row + 1][col]));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 设置模型所对应的组件
	 * 
	 * @param component
	 *            对应的组件
	 */
	public void setComponent(HTMLBasicComponent component) {
		this.component = component;
	}

	/**
	 * 排序
	 * 
	 * @param key
	 *            关键字
	 */
	public void sort(String key) {
		if (datas == null) {
			return;
		}
		this.setsort();
		// 设置排序关键字
		this.sortname = key;
		// 找排序关键字所在列号
		int index = 0;
		String className = this.getClass().getName();
		className = className.substring(className.lastIndexOf(".") + 1);
		for (int i = 0; i < this.getColumnCount(); i++) {
			if (key.equals(className + i)) {
				index = i;
			}
			break;
		}
		// 把正式数据存入临时区
		String[][] tempdatas = new String[datas.length - 1][datas[0].length];
		for (int i = 0; i < datas.length - 1; i++) {
			for (int j = 0; j < datas[0].length; j++) {
				tempdatas[i][j] = datas[i + 1][j];
			}
		}
		// 根据要排序列号排临时区内容
		Arrays.sort(tempdatas, new StringComparator(index));
		// 把排好序的临时区数据放回正式区
		for (int i = 1; i < datas.length; i++) {
			for (int j = 0; j < datas[0].length; j++) {
				datas[i][j] = tempdatas[i - 1][j];
			}
		}
	}

	public boolean getOrderBy() {
		return this.orderby;
	}

	public void setOrderBy() {
		this.orderby = !this.orderby;
	}

	/**
	 * 倒排顺序
	 * 
	 * @param key
	 *            排序关键字
	 */
	public void reverseSort(String key) {
		// 顺排
		this.sort(key);
		if (datas == null) {
			return;
		}
		// 调换
		for (int i = 1; i <= datas.length / 2; i++) {
			String[] temp = datas[i];
			datas[i] = datas[datas.length - i];
			datas[datas.length - i] = temp;
		}
	}

	public void setsort() {
		this.issort = true;
	}

	public boolean getsort() {
		return this.issort;
	}

	public String getsortname() {
		return this.sortname;
	}

	/**
	 * 模型更新页面元素
	 * 
	 * @throws Exception
	 */
	public void updatePageElement(HTMLBasicComponent c) throws Exception {
	}
}